package com.bonshotels.DomainLayer.CtrlDades;

import com.bonshotels.DataLayer.CtrlDadesHibernate.FactoriaCtrlDadesHibernate;

/**
 * Aquesta classe acaba d'implementar el patro Factoria Abstracta + Singleton, ens ha calgut aquesta
 * classe abstracta intermitja perque no ens es possible posar metodes ni atributs estatics a
 * interficies. Aquesta implementacio del patro factoria abstracta es imitada de la p.608 de la
 * tercera edicio de "Applying UML and Patterns" d'en Craig Larman.
 * @author Marc Mauri Alloza
 */
public abstract class FactoriaCtrlDades implements IFactoriaCtrlDades {

	/** The instance. */
	private static IFactoriaCtrlDades instance;
	
	/**
	 * Instancia una nova FactoriaCtrlDades. Com que aquesta classe implementa el patro Singleton
	 * la constructora hauria de ser privada, pero com que les Factories Concretes hauran d'heredar
	 * d'aquest singleton i les seves constructores utilizen implicitament la construtora de la
	 * superclasse cal que aquesta constructora sigui protegida, pero poder-la cridar
	 * implicitament des de les subclasses.
	 */
	protected FactoriaCtrlDades() {
		
	}
		
	/**
	 * Obte una instancia de la Factoria Concreta. En aquest metode es crea la unica dependencia de
	 * capa de domini amb capa de dades, hem mirat d'eliminar totes les dependencies de domini amb dades
	 * i la unica que ens ha quedat es aquesta. En el cas de voler canviar de factoria de ctrl de dades
	 * per una que implementi la persistencia amb una altra Sistema de Gestio de Dades concret nomes
	 * caldria canviar:
	 * <ul><li> "import com.bonshotels.DataLayer.CtrlDadesHSQLDB.FactoriaCtrlDadesHSQLDB;" per una altra classe
	 * que heredi de FactoriaCtrlDades i que implementi els seus metodes pel nou Sistema de Gestio de Dades.
	 * <li> "new FactoriaCtrlDadesHSQLDB();" per el new d'una altra per una altra classe
	 * que heredi de FactoriaCtrlDades que implementi els seus metodes pel nou Sistema de Gestio de Dades.
	 * </ul>
	 * 
	 * Es poria evitar completament la dependencia del Sistema de Gestio de Dades desant el nom de la classe
	 * de la Factoria Concreta en un fitxer de text, arregnat el text i carregant la classe utilitzant
	 * reflexio, tal com recomana Craig Larman a la p.608 de la
	 * tercera edicio de "Applying UML and Patterns".
	 * 
	 *
	 * @return the i factoria ctrl dades
	 */
	public static IFactoriaCtrlDades obteInstancia() {
		if(instance == null) {
                instance = new FactoriaCtrlDadesHibernate();
        }
        return instance;
	}
	
	/* (non-Javadoc)
	 * @see com.bonshotels.DomainLayer.CtrlDades.IFactoriaCtrlDades#obteCtrlPoblacio()
	 */
	@Override
	public abstract ICtrlPoblacio obteCtrlPoblacio();

	/* (non-Javadoc)
	 * @see com.bonshotels.DomainLayer.CtrlDades.IFactoriaCtrlDades#obteCtrlHotel()
	 */
	@Override
	public abstract ICtrlHotel obteCtrlHotel();

	/* (non-Javadoc)
	 * @see com.bonshotels.DomainLayer.CtrlDades.IFactoriaCtrlDades#obteCtrlClient()
	 */
	@Override
	public abstract ICtrlClient obteCtrlClient();

	/* (non-Javadoc)
	 * @see com.bonshotels.DomainLayer.CtrlDades.IFactoriaCtrlDades#obteCtrlHabitacio()
	 */
	@Override
	public abstract ICtrlHabitacio obteCtrlHabitacio();

	/* (non-Javadoc)
	 * @see com.bonshotels.DomainLayer.CtrlDades.IFactoriaCtrlDades#obteCtrlBonsHotels()
	 */
	@Override
	public abstract ICtrlBonsHotels obteCtrlBonsHotels();

}
